2oneweek.dev

07. Function 키워드와 내부 프로퍼티

    Tags

  • JavaScript
07. Function 키워드와 내부 프로퍼티 thumbnail

Function 키워드와 내부 프로퍼티

실행 환경을 설정하는 시점은

  • 엔진이 function 키워드를 만나 function object를 생성할 때다. 이때 설정하는 것은 함수가 속한 스코프(실행 영역 - 즉 Lexical Scope)
  • 엔진이 function 키워드를 만났을 때 코드가 실행되는 것이 아니다. function 키워드를 만나고 한참 후에나 실제 사용을 하게 되므로 function 오브젝트를 저장해둬야 한다.

어디에 저장하는가?

생성한 function 오브젝트에 저장한다. 생성한 function object 안에 함수가 실행될 수 있는 환경이 담겨있는 것이다. 그냥 프로퍼티로 담는 것이 아니라, function object의 **"내부 프로퍼티"**에 {name:value} 형태로 실행 환경을 저장한다.

내부 프로퍼티

내부 프로퍼티란 엔진이 내부 처리에 사용하는 프로퍼티로, 외부에서 사용 불가능 하다. 즉, 개발자가 접근할 수 없는 프로퍼티다. 이러한 내부 프로퍼티는 [[Scope]] : {}와 같은 형태로 저장된다. 로 저장됨

내부 프로퍼티는 "공통 프로퍼티"와 "선택적 프로퍼티"로 나뉜다.

  • 공통 프로퍼티 :모든 오브젝트(JS built-in Object로 만드는 오브젝트)에 공통으로 설정되는 프로퍼티
  • 선택적 프로퍼티 : 오브젝트에 따라 선택적으로 설정되는 프로퍼티
    • Array Object에는 설정되지만 String Object에는 설정되지 않는 것들

공통 내부 프로퍼티

  • [[Prototype]] 값: Object 또는 Null
    • 모든 오브젝트라고 하지만, prototype을 가지지 않는 오브젝트도 있다. (예: Math Object)
  • [[Class]] 값: String
    • 오브젝트의 유형을 구분하는 내부 프로퍼티, 이걸로 오브젝트를 판별한다.
  • [[Extensible]] 값: Boolean
    • 오브젝트에 새로운 프로퍼티를 추가 가능한지 여부를 담고있다.
  • [[Get]] 값: any
    • 이름의 프로퍼티 값, getter라고 보면 된다.
  • [[GetOwnProperty]] 값: 프로퍼티 디스크립터
  • [[GetProperty]] 값: 프로퍼티 디스크립터
  • [[Put]]
    • 프로퍼티 이름으로, 프로퍼티 값을 설정
  • [[CanPut]] 값: boolean
    • 값(value) 설정 가능 여부를 담고 있다.
  • [[HasProperty]] 값: boolean
    • 프로퍼티의 존재 여부를 담는다.
  • [[Delete]] 값: boolean
    • 오브젝트에서 프로퍼티 삭제 가능 여부를 담는다.
  • [[DefaultValue]] 값: any
    • 오브젝트의 디폴트 값을 담고 있다.
  • [[DefinedOwnProperty]]
    • 프로퍼티 추가, 프로퍼티 값 변경 가능 여부를 담는다.
프로퍼티 디스크립터(propertyDescriptor)라는 객체에 대해 더 알아봐야 될 듯


선택적 내부 프로퍼티

오브젝트에 따라 선택적으로 설정되는 내부 프로퍼티다.

  • [[PrimitiveValue]] 값: primitive 값
    • Boolean, Date, Number, String 오브젝트에서만 설정됨
    • 개발자 도구로 확인할 수 있는 내부 프로퍼티 중 첫번째
  • [[Construct]] 값: Object
    • new 연산자로 호출되며 인스턴스를 생성한다. Math 객체는 Constructor가 없어서 인스턴스를 생성하지 못하지만, 대부분의 객체는 생성자를 가지고 있으므로 인스턴스를 생성할 수 있다.
  • [[Call]] 값: any
    • 함수 호출
  • [[HasInstance]] 값: Boolean
    • 지정한 오브젝트로 생성한 인스턴스인지 확인하기 위해 사용한다.
    • instanceof 키워드라 생각하면 된다.
  • [[Scope]] 값: lexical enviroment
    • Function Object가 들고 있는 내부프로퍼티
    • Function 키워드를 만나면 엔진이 Function Object를 만들 때, Function Object가 실행되는 렉시컬(정적) 환경이 설정되는 공간이다.
    • 개발자 도구로 확인할 수 있는 내부 프로퍼티 중 두번째
  • [[FormalParameters]] 값: 문자열 리스트
    • 호출된 함수의 파라미터 이름 리스트를 담고 있다.
  • [[Code]] 값: JS 코드
    • Function Object를 만들 때, 여기에다가 코드를 저장하게 된다.
    • 함수에 작성한 JS 코드가 저장되고, 함수가 호출되었을 때 여기 담긴 것을 해석하고 실행한다.
  • [[TargetFunction]] 값: Object
    • bind()메소드에서 사용
    • Function Object의 bind()에, 새로 생성한 타깃 함수 오브젝트를 설정
  • [[BoundThis]] 값: any
    • bind()메소드에서 사용
    • bind()에 바인딩된 this 오브젝트가 설정된다.(bind메소드의 첫번째 인자가 저장됨)
  • [[BoundArguments]] 값: List
    • bind()메소드에서 사용
    • bind()에 바인딩된 argument list가 설장된다(bind 메소드의 두번째 인자가 저장됨)
  • [[Match]] 값: 매치 결과
    • built-in 정규표현식 객체에 쓰인다.
    • 정규표현식의 매치 결과가 담긴다.
  • [[ParameterMap]] 값: Object
    • argument objetc와 함수의 파라미터를 매핑

엔진이 function 키워드를 만나면 function object를 생성하고, 함수가 호출되면 실행컨텍스트를 만드는 것, function object가 생성될 때 [[scope]]에 함수가 속한 영역을 저장한다.(이것이 lexical scope)

function object 생성시점과, execution context 생성시점이 다르다. 어딘가에 저장된 function object를 어떻게 참고해서 execution context가 생성하는지는 더 알아봐야 될 것 같다.

Written by@2-one-week
현재 블로그 개발 중

GitHubLinkedIn